package com.example.mqdemo.rabbit;

import com.example.mqdemo.common.ExchangeConstant;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.ExchangeBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * rabbitmq交换配置
 * exchange类型:
 * 1.direct:处理路由键，需要将一个队列绑定到交换机上，要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。
 * 如果一个队列绑定到该交换机上要求路由键为 “green”，则只有路由键为“green”的消息才被转发，不会转发路由键为"red"，只会转发路由键为"green"。
 * 2.topic:将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词，符号“*”只能匹配一个词。routing_key(first.green.fast) -> queue(*.fast)
 * 3.Fanout:Fanout 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到该类型交换机的消息都会被广播到与该交换机绑定的所有队列上
 * 4.Headers:不处理路由键，而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对；
 * 当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配；
 * 如果完全匹配则消息会路由到该队列，否则不会路由到该队列。headers属性是一个键值对，可以是Hashtable，键值对的值可以是任何类型。
 * 而fanout，direct，topic 的路由键都需要要字符串形式的
 */
@Configuration
public class ExchangeConfig {

    /**
     * 订单的交换机
     *
     * @return
     */
    @Bean(ExchangeConstant.orderChangeName)
    public Exchange orderExchange() {
        return ExchangeBuilder.directExchange(ExchangeConstant.orderChangeName).durable(true).build();
    }

    /**
     * 取消订单死信交换机
     *
     * @return
     */
    @Bean(ExchangeConstant.orderCancelDeadChangeName)
    public Exchange orderCancelExchange() {
        return ExchangeBuilder.directExchange(ExchangeConstant.orderCancelDeadChangeName).durable(true).build();
    }

    /**
     * 取消订单交换机
     *
     * @return
     */
    @Bean(ExchangeConstant.orderCancelChangeName)
    public Exchange orderCancelDeadExchange() {
        return ExchangeBuilder.directExchange(ExchangeConstant.orderCancelChangeName).durable(true).build();
    }
}
